Deep Learning for Human Language Processing Part 5(P10 to P11)
课程主页:http://speech.ee.ntu.edu.tw/~tlkagk/courses_DLHLP20.html
视频地址:https://www.bilibili.com/video/BV1RE411g7rQ?p=1
参考资料:https://blog.csdn.net/qq_44574333/category_10304412_2.html
备注:图片均来自于课件。
这次回顾P10至P11,这部分介绍了语音转换问题。
语音转换
简介
语音转换模式如下:
- 输入:语音
- 输出:语音
目标:
- 保留内容信息。
- 改变其他的信息。
- 说话者。
- 说话风格。
- 增加可理解性。
- 数据增强。
改变的信息
说话者
- 不同的人说的同一句话有不同的效果。
- Deep Fake:欺骗人/语音验证系统。
- 实现个性化TTS(语音合成系统,即转换成任何人的声音)的一种简单方法。
- 歌声转换。
说话风格
- 情感。
- 普通到Lombard。
- Lombard的介绍可以参考视频。
- 悄悄话转换到正常声音。
- 歌唱技巧转换。
增加可理解性
- 改善语音清晰度。
- 口音转换。
- 非母语使用者的语音质量和母语使用者的发音模式。
- 例如将非标准的英语转换成标准的英语。
- 可用于语言学习。
- 听自己的声音更容易学习语言。
- 非母语使用者的语音质量和母语使用者的发音模式。
数据增强
如下方法可以将数据量增加:
- 将男性的声音和成女性的声音互相转换。
- 将有噪音的声音和无噪音的声音相互转换。
实现
通常输入和输出的长度相同,所以不需要Seq2Seq模型:
注意声学信号无法直接恢复成原本的声学信号,这部分还需要Vocoder:
这部分有两种方法:
- 基于规则:Griffin-Lim算法。
- 深度学习:WaveNet。
本讲不会介绍Vocoder。
分类
成对数据(句子相同):
难点是可能会缺乏数据,解决方法为:
- 模型预训练。
- 合成数据:
- 收集一些人讲的句子,利用语音识别技术转换成文本,再将这些文本转换成声音。
非成对数据(句子不同):
“音频风格转移”
从图像风格转移中借鉴技术。
具体分类:
- 特征解开(Feature Disentangle)
- 直接转换(Direct Transformation)
- 本讲主要讨论非成对数据的训练,会具体介绍这两种方法。
特征解开(Feature Disentangle)
特征解开利用Encoder,Decoder思路:在编码器部分声音信号转换成内容和语者两部分,将两者作为解码器的输入,输出恢复成声音信号。
现在进行声音转换,只要将语者部分的更换即可:
训练方法和Encoder,Decoder类似:
这里有一个难点,如何保证两个Encoder分别抽取内容和语者的信息呢?
利用语者信息
去掉Speaker Encoder,将其替换为语者的one-hot向量(这里假设我们知道训练话语的使用者):
该方法的问题是,很难加入新的语者。
预训练Encoder
预训练Encoder:
- Speaker Encoder:利用Speaker embedding(i-vector, d-vector, x-vector)。
- Content Encoder:利用语音识别系统,例如HMM中DNN部分,该网络预测声音处于某个状态的概率分布。
对抗训练
在Content Encoder后接一个Speaker Classifier:
- Content Encoder学会如何欺骗Speaker Classifier(尽可能抽取和语者无关的信息)。
设计网络结构
在Content Encoder中增加instance normalization(去除语者信息),具体来说:
- 输入声音信号。
- 一维卷积。
- 对每个频道正规化。
- 每个频道可以理解为某种特征,正规化减少了语者的信息。
在Encoder中增加adaptive instance normalization,在减少对内容的影响下,将语者信息加入到Decoder,具体如下:
对Decoder的输出作用instance normalization。
- 这一步去掉语者信息。
Speaker Encoder有两个输出$\gamma,\beta$,将其和Decoder的输出作用得到
这一步增加语者信息。
图示:
2阶段训练
在实际中,AutoEncoder方法产生的声音效果不是特别好,老师说原因可能如下:
- 训练的目标是产生AutoEncoder,不是进行声音转换。
- 训练阶段Content Encoder的语者和Speaker Encoder的语者相同,但是测试的时候并不同。
为了解决这点,可以使用2阶段训练:
- 第1阶段:
- 训练阶段Content Encoder的语者和Speaker Encoder的语者不同。
- 这样做的问题是,并没有正确答案,为了解决这点,就要依靠第二阶段。
- 第2阶段(利用Gan的思路):
- 增加一个Discriminator,判断声音是真实还是生成的。
- 增加一个Speaker Classifier,判断语者是谁。
- 补充:
- 如果直接这样训练效果会不太好,一个解决方法是增加Patcher(补丁),将Patcher的输出叠加到Decoder的输出。
图示如下:
直接转换(Direct Transformation)
直接转换是指利用风格转换的思路,利用GAN的思想。
Cycle GAN
- $G_{X\to Y}$:让$X$的声音接近于$Y$的声音。
- $D$:判断$G$的输出是否属于$Y$。
但是这样训练,$G_{X\to Y}$很容易产生出$Y$使用最多的声音,解决这点的方法是增加$G_{Y\to X}$。
其他训练技巧:
- 对于$G_{X\to Y}$,我们希望输入$Y$的声音也会返回同样的声音。
对称的,我们可以将$Y$转换成$X$的声音:
StarGAN
对于$N$个语者,Cycle GAN需要$N(N-1)$个模型,StarGAN就是为了解决这点:
- 将声学信息和语者信息输入给$G$。
- 将声学信息和语者信息输入给$D$。
整体结构:
- 将声学信息和语者信息输入给$G$,得到新的声音。
- 将同一个语者的信息和$G$的输出输入给$D$,判断当前声音是否属于该语者。
Blow
这部分老师没有介绍,这里留空后续补充。